package com.itheima.reggie.web.controller;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.itheima.reggie.entity.Category;
import com.itheima.reggie.entity.dto.PageDto;
import com.itheima.reggie.service.CategoryService;
import com.itheima.reggie.web.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 分类控制器
 *
 * @Author Vsunks.v
 * @Blog blog.sunxiaowei.net/996.mba
 * @Description: 分类控制器，包含了菜品分类和套餐分类
 */
@Slf4j
@RestController
@RequestMapping("/category")
public class CategoryController {

    @Autowired
    CategoryService categoryService;


    @PostMapping
    public R save(@RequestBody Category category) {

        // 记录日志
        log.info("新增分类，信息如下：[{}]", category);


        // 保存分类
        boolean result = categoryService.save(category);


        // 组织数据并返回
        if (result) {
            return R.success("新增成功", null);
        }
        return R.fail("新增失败");
    }


    /**
     * 分页查询
     *
     * @param pageDto 分页参数
     * @return 查询到的数据
     */
    @GetMapping("/page")
    public R<Page<Category>> page(PageDto pageDto) {
        // 记录日志
        log.info("分页查询分类，第[{}]页，查询[{}]条", pageDto.getPage(), pageDto.getPageSize());

        // TODO 参数校验

        // 调用Service处理并返回数据
        // 组织数据并返回
        return categoryService.page(pageDto);

        // return null;
    }


    /**
     * 根据id删除分类
     *
     * @param id
     * @return
     */
    // @DeleteMapping
    @Deprecated
    public R deleteByIdx(Long id) {

        // 记录日志
        log.info("根据id删除分类，id为[{}]", id);

        // 调用service删除对应的分类
        boolean result = categoryService.removeById(id);

        // 组织数据并返回
        if (result) {
            return R.success("删除分类成功", null);
        }
        return R.fail("删除分类成功");
    }


    /**
     * 根据id删除分类，删除时检查是否正在使用
     *
     * @param id 要删除的分类的id
     * @return 是否删除成功
     */
    @DeleteMapping
    public R deleteByIdCheckUsing(Long id) {

        // 记录日志
        log.info("根据id删除分类，id为[{}]", id);

        // 调用service删除对应的分类
        // 组织数据并返回
        return categoryService.removeByIdCheckUsing(id);

    }


    /**
     * 修改，并检查名称是否重复
     *
     * @param category 要修改的参数
     * @return 修改是否成功
     */
    @PutMapping
    public R updateByIdWithNameCheck(@RequestBody Category category) {

        // 记录日志
        log.info("修改分类，目标信息如下：[{}]", category);

        // 调用Service提交修改
        // 组织数据并返回
        return categoryService.updateByIdWithNameCheck(category);

    }


    /**
     * 根据条件查询分类，目前的条件只有type
     *
     * @param category 查询条件封装的实体对象
     * @return 符合要求的所有分类对象
     */
    @GetMapping("/list")
    public R<List<Category>> findByCondition(Category category) {
        // 记录日志
        log.info("按条件查询分类，查询条件：[{}]", category);

        // 调用service查询
        // 组织数据并返回
        return categoryService.listByCondition(category);
    }
}
